package com.wy._07Thread.mainThread;

/**
 * @author 吴宇~
 * @motto 我亦无他，唯手熟尔。
 * @edition jdk1.8
 * @reflection 0-1 喧闹任其喧闹，自由我自为之，我自风情万种，与世无争。
 * @date 2023/06/15/22:46
 * @target 心若有所向往，何惧道阻且长
 */

import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;

/**
 * 播放音乐的文件
 * 是单线程的，占有主线程！！
 */
public class PlayMusic {
    /**
     * 在主线程上开始播放音乐，回族死啊后面的代码， 因为就一个线程，这种可以使用，但是不能让他阻塞吧， 得创建一个新的线程，来播放，
     * @param filePath 文件路径
     * @throws LineUnavailableException
     * @throws IOException
     * @throws UnsupportedAudioFileException
     */
    public static void playMusic(String filePath) throws LineUnavailableException, IOException, UnsupportedAudioFileException {
        //1 获取你要播放的音乐文件
        File file = new File(filePath);
        //2、定义一个AudioInputStream用于接收输入的音频数据
        AudioInputStream am;
        //3、使用AudioSystem来获取音频的音频输入流(处理（抛出）异常)
        am = AudioSystem.getAudioInputStream(file);
        //4、使用AudioFormat来获取AudioInputStream的格式
        AudioFormat af = am.getFormat();
        //5、一个源数据行
        SourceDataLine sd ;
        //6、获取受数据行支持的音频格式DataLine.info
        //DataLine.Info dl = new DataLine.Info(SourceDataLine.class, af);
        //7、获取与上面类型相匹配的行 写到源数据行里 二选一
        sd = AudioSystem.getSourceDataLine(af);//便捷写法
        //sd = (SourceDataLine) AudioSystem.getLine(dl);
        //8、打开具有指定格式的行，这样可以使行获得资源并进行操作
        sd.open();
        //9、允许某个数据行执行数据i/o
        sd.start();
        //10、写数据
        int sumByteRead = 0; //读取的总字节数
        byte [] b = new byte[320];//设置字节数组大小
        //11、从音频流读取指定的最大数量的数据字节，并将其放入给定的字节数组中。
        while (sumByteRead != -1) {//-1代表没有 不等于-1时就无限读取
            sumByteRead = am.read(b, 0, b.length);//12、读取哪个数组
            if(sumByteRead >= 0 ) {//13、读取了之后将数据写入混频器,开始播放
                sd.write(b, 0, b.length);

            }
        }
        //关闭
        sd.drain();
        sd.close();
    }

    /**
     *  单线程一个音乐循环播放多次
     * @param filePath
     * @param NumberOfCycles
     * @throws UnsupportedAudioFileException
     * @throws IOException
     * @throws LineUnavailableException
     */
    public static void start(String filePath, int NumberOfCycles) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
        for (int i = 0; i < NumberOfCycles; i++) {
            playMusic(filePath);
        }
    }
}
